﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace HeUtils
{
    public static class BytesCompare
    {
        [DllImport("msvcrt.dll")]   // 需要使用的dll名称
        private static extern unsafe int memcmp(byte* b1, byte* b2, int count);

        // 由于指针使用是内存不安全的操作，所以需要使用unsafe关键字
        // 项目文件中也要加入<AllowUnsafeBlocks>true</AllowUnsafeBlocks>来允许unsafe代码
        #nullable enable
        public static unsafe bool MemcmpCompare(byte[]? x, byte[]? y)
        {
            if (ReferenceEquals(x, y)) return true;
            if (x is null || y is null) return false;
            if (x.Length != y.Length) return false;

            // 在.NET程序的运行中，垃圾回收器可能会整理和压缩内存，这样会导致数组地址变动
            // 所以，我们需要使用fixed关键字，将x和y数组'固定'在内存中，让GC不移动它
            // 更多详情请看 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/fixed-statement
            fixed (byte* xPtr = x, yPtr = y)
            {
                return memcmp(xPtr, yPtr, x.Length) == 0;
            }
        }
    }
}
